package com.beidu.lottery.call.utils;

import com.beidu.lottery.call.constant.CacheKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * 活动序列工具类
 *
 * @author 北渡
 * @since 2023-08-30
 */
@Component
public class ActSequenceGen {

    private static RedisUtil redisUtil;

    @Autowired
    public ActSequenceGen(RedisUtil redisUtil) {
        ActSequenceGen.redisUtil = redisUtil;
    }

    /**
     * 生成报名编号
     * <p>
     * 序列算法：每日0:00:00重置，最小从1开始。
     *
     * @param id 活动id
     * @return 活动id + MMddHHmmss + 序列
     * @author 北渡
     */
    public static String genRegNumber(Integer id) {
        Objects.requireNonNull(id);
        return id + LocalDateUtils.getTimestampWithoutYear() +
                redisUtil.incr(CacheKey.SEQUENCE_REG, 1, LocalDateUtils.getTodayExpireTimestamp());
    }

    /**
     * 生成投票编号
     * <p>
     * 序列算法：每日0:00:00重置，最小从1开始。
     *
     * @param id 活动id
     * @return 活动id + MMddHHmmss + 序列
     * @author 北渡
     */
    public static String genVoteNumber(Integer id) {
        Objects.requireNonNull(id);
        return id + LocalDateUtils.getTimestampWithoutYear() +
                redisUtil.incr(CacheKey.SEQUENCE_VOTE, 1, LocalDateUtils.getTodayExpireTimestamp());
    }

    /**
     * 生成抽奖编号（订单编号）
     * <p>
     * 序列算法：每日0:00:00重置，最小从1开始。
     *
     * @param id 活动id
     * @return yyyyMMddHHmmss + 活动id +  序列
     * @author 北渡
     */
    public static String genLotteryNumber(Integer id) {
        Objects.requireNonNull(id);
        return LocalDateUtils.getTimestamp() + id +
                redisUtil.incr(CacheKey.SEQUENCE_VOTE, 1, LocalDateUtils.getTodayExpireTimestamp());
    }

    /**
     * 生成通用序列（MQ主键）
     * <p>
     * 序列算法：每日0:00:00重置，最小从1开始。
     *
     * @return yyyyMMddHHmmss + 序列
     * @author 北渡
     */
    public static String genMQSeq() {
        return LocalDateUtils.getTimestamp() +
                redisUtil.incr(CacheKey.SEQUENCE_MQ, 1, LocalDateUtils.getTodayExpireTimestamp());
    }

}
